import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

public class DataContainer<T> {
    // 学号绑定（根据要求添加）
    public static final String STUDENT_ID = "202411671450";

    private List<T> dataList;

    // 无参构造 —— 初始化空 ArrayList
    public DataContainer() {
        this.dataList = new ArrayList<>();
    }

    // 带参构造 —— 深拷贝传入列表（避免外部修改影响）
    public DataContainer(List<T> initData) {
        this.dataList = new ArrayList<>(initData);
    }

    // 核心方法：添加元素
    public void add(T element) {
        dataList.add(element);
    }

    // 核心方法：添加另一个泛型容器的所有元素，使用? extends T通配符
    public void addAll(DataContainer<? extends T> otherContainer) {
        for (T element : otherContainer.dataList) {
            this.dataList.add(element);
        }
    }

    // 核心方法：根据索引获取元素，进行边界检查
    public T get(int index) {
        if (index < 0 || index >= dataList.size()) {
            throw new IndexOutOfBoundsException("索引超出范围，有效索引范围：0 - " + (dataList.size() - 1));
        }
        return dataList.get(index);
    }

    // 核心方法：根据谓词过滤元素，返回新容器
    public DataContainer<T> filter(Predicate<? super T> predicate) {
        DataContainer<T> newContainer = new DataContainer<>();
        for (T element : dataList) {
            if (predicate.test(element)) {
                newContainer.add(element);
            }
        }
        return newContainer;
    }

    // 核心方法：返回数据列表的副本
    public List<T> toList() {
        return new ArrayList<>(dataList);
    }

    // 核心方法：返回容器中元素的个数
    public int size() {
        return dataList.size();
    }

    // 核心方法：清空容器
    public void clear() {
        dataList.clear();
    }
}
